home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / qtools0.2-src.lha / src / libqdisplay / display.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  11.7 KB  |  433 lines

  1. #define    LIBQTOOLS_CORE
  2. #define    LIBQDISPLAY_CORE
  3. #include "../include/libqdisplay.h"
  4. #include "../include/libqsys.h"
  5.  
  6. int frameCounter;
  7. int displayType;
  8.  
  9. #ifdef CALCULATE_PIXELDRAW
  10. int pixelDraw;
  11. int pixelOverdraw;
  12. #endif
  13.  
  14. void run_demo(__memBase)
  15. {
  16.   angvec lastCamera =
  17.   {0, 0, 0};
  18.   int flyMode = FALSE;
  19.   int updownHeight, leftrightWidth;
  20.   float updownAngles, leftrightAngles;
  21.   int position = CONTENTS_EMPTY;                /* content */
  22.  
  23. #ifdef PROFILE
  24.   for (frameCounter = 0; frameCounter < 18; frameCounter++) {
  25. #else
  26.   struct keyEvent inPut;
  27.  
  28.   for (frameCounter = 0;; frameCounter++) {
  29. #endif
  30.     /*
  31.      * first verify the validity of the display and the renderers informations
  32.      */
  33.     if (localDim.changedBuffer) {                /* changedSize need not implicate changeBuffer */
  34.       InitMultTables(localDim.Width, localDim.Height);
  35.       set_clip_values(localDim.Width, localDim.Height);
  36.       localDim.changedBuffer = FALSE;
  37.       changedAngles = TRUE;
  38.     }
  39.     if (localDim.changedOffset || localDim.changedSize) {
  40.       if (flyMode) {
  41.     cameraAngles.tx = (int)((localDim.X - updownHeight) * updownAngles);
  42.     cameraAngles.tz = (int)((localDim.Y - leftrightWidth) * leftrightAngles);
  43.     changedAngles = TRUE;
  44.       }
  45.       if (localDim.changedSize) {
  46.     updownHeight = (localDim.dtHeight - localDim.Height) / 2;
  47.     leftrightWidth = (localDim.dtWidth - localDim.Width) / 2;
  48.     updownAngles = 90.0 / updownHeight;
  49.     leftrightAngles = 180.0 / leftrightWidth;
  50.       }
  51.       localDim.changedOffset = FALSE;
  52.       localDim.changedSize = FALSE;
  53.     }
  54.     if (localDim.changedDesktopOffset) {
  55.       localDim.changedDesktopOffset = FALSE;
  56.     }
  57.     if (localDim.changedDesktopSize) {
  58.       updownHeight = (localDim.dtHeight - localDim.Height) / 2;
  59.       leftrightWidth = (localDim.dtWidth - localDim.Width) / 2;
  60.       updownAngles = 90.0 / updownHeight;
  61.       leftrightAngles = 180.0 / leftrightWidth;
  62.       localDim.changedDesktopSize = FALSE;
  63.     }
  64.     __bzero(localDim.frameBuffer, localDim.frameSize * localDim.frameBPP);
  65.  
  66. #ifdef CALCULATE_PIXELDRAW
  67.     __bzero(localDim.frameBuffer, localDim.frameSize * localDim.frameBPP);
  68.     mprintf("draw pixel: %d, overdrawn pixel: %d\n", pixelDraw, pixelOverdraw);
  69.     pixelDraw = pixelOverdraw = 0;
  70. #endif
  71. #ifndef PROFILE
  72.     /*
  73.      * parse inputevents, this is also the only way to communicate 
  74.      * with the user-interface, if the display changes, verify it in
  75.      * that routine
  76.      */
  77.     while (GetKeys(&inPut)) {
  78.       if (inPut.pressed == RAWKEY_NOTHING)
  79.     break;
  80.  
  81.       switch (inPut.pressed) {
  82.     case RAWKEY_ESCAPE:
  83.     case RAWKEY_q:
  84.       return;
  85.       break;
  86.  
  87.     case RAWKEY_w:
  88.       displayType = DISPLAY_WIRE;
  89.       break;
  90.     case RAWKEY_l:
  91.       displayType = DISPLAY_FLAT;
  92.       break;
  93.     case RAWKEY_t:
  94.       displayType = DISPLAY_TEXTURED;
  95.       break;
  96.  
  97.     case RAWKEY_NUMPAD_PGDN:
  98.       cameraAngles.tx += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  99.       changedAngles = TRUE;
  100.       break;
  101.     case RAWKEY_NUMPAD_PGUP:
  102.       cameraAngles.tx -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  103.       changedAngles = TRUE;
  104.       break;
  105.     case RAWKEY_NUMPAD_HOME:
  106.       currentSpeed[2] += (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  107.       changedLocation = TRUE;
  108.       break;
  109.     case RAWKEY_NUMPAD_END:
  110.       currentSpeed[2] -= (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  111.       changedLocation = TRUE;
  112.       break;
  113.     case RAWKEY_NUMPAD_AWUP:
  114.       currentSpeed[0] += (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  115.       changedLocation = TRUE;
  116.       break;
  117.     case RAWKEY_NUMPAD_AWDN:
  118.       currentSpeed[0] -= (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  119.       changedLocation = TRUE;
  120.       break;
  121.     case RAWKEY_NUMPAD_AWRIGHT:
  122.       cameraAngles.tz += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  123.       changedAngles = TRUE;
  124.       break;
  125.     case RAWKEY_NUMPAD_AWLEFT:
  126.       cameraAngles.tz -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  127.       changedAngles = TRUE;
  128.       break;
  129.     case RAWKEY_NUMPAD_PLUS:
  130.       cameraAngles.ty += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  131.       changedAngles = TRUE;
  132.       break;
  133.     case RAWKEY_NUMPAD_MINUS:
  134.       cameraAngles.ty -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  135.       changedAngles = TRUE;
  136.       break;
  137.     case RAWKEY_f:
  138.       if ((flyMode ^= TRUE) == TRUE)
  139.         currentSpeed[0] = currentSpeed[2] = (maxSpeed / 3);
  140.       else
  141.         currentSpeed[2] = -(maxSpeed / 3);
  142.       changedLocation = TRUE;
  143.       break;
  144.       }
  145.     }
  146. #else
  147.     switch (frameCounter) {
  148.       case 0:
  149.     cameraAngles.tx += 15;
  150.     cameraAngles.tz += 10;
  151.     changedAngles = TRUE;
  152.     break;
  153.       case 1:
  154.     cameraAngles.tx += 15;
  155.     cameraAngles.tz += 10;
  156.     changedAngles = TRUE;
  157.     break;
  158.       case 2:
  159.     cameraAngles.tx += 15;
  160.     cameraAngles.tz += 10;
  161.     changedAngles = TRUE;
  162.     break;
  163.       case 3:
  164.     cameraAngles.tx -= 15;
  165.     cameraAngles.tz += 10;
  166.     changedAngles = TRUE;
  167.     break;
  168.       case 4:
  169.     cameraAngles.tx -= 15;
  170.     cameraAngles.tz += 10;
  171.     changedAngles = TRUE;
  172.     break;
  173.       case 5:
  174.     cameraAngles.tx -= 15;
  175.     cameraAngles.tz += 10;
  176.     changedAngles = TRUE;
  177.     break;
  178.       case 6:
  179.     cameraAngles.tx -= 15;
  180.     cameraAngles.tz += 10;
  181.     changedAngles = TRUE;
  182.     break;
  183.       case 7:
  184.     cameraAngles.tx -= 15;
  185.     cameraAngles.tz += 10;
  186.     changedAngles = TRUE;
  187.     break;
  188.       case 8:
  189.     cameraAngles.tx -= 15;
  190.     cameraAngles.tz += 10;
  191.     changedAngles = TRUE;
  192.     break;
  193.       case 9:
  194.     cameraAngles.tx += 15;
  195.     cameraAngles.tz += 10;
  196.     changedAngles = TRUE;
  197.     break;
  198.       case 10:
  199.     cameraAngles.tx += 15;
  200.     cameraAngles.tz += 10;
  201.     changedAngles = TRUE;
  202.     break;
  203.       case 11:
  204.     cameraAngles.tx += 15;
  205.     cameraAngles.tz += 10;
  206.     changedAngles = TRUE;
  207.     break;
  208.       case 12:
  209.     cameraAngles.tx += 15;
  210.     cameraAngles.tz += 10;
  211.     changedAngles = TRUE;
  212.     break;
  213.       case 13:
  214.     cameraAngles.tx += 15;
  215.     cameraAngles.tz += 10;
  216.     changedAngles = TRUE;
  217.     break;
  218.       case 14:
  219.     cameraAngles.tx += 15;
  220.     cameraAngles.tz += 10;
  221.     changedAngles = TRUE;
  222.     break;
  223.       case 15:
  224.     cameraAngles.tx -= 15;
  225.     cameraAngles.tz += 10;
  226.     changedAngles = TRUE;
  227.     break;
  228.       case 16:
  229.     cameraAngles.tx -= 15;
  230.     cameraAngles.tz += 10;
  231.     changedAngles = TRUE;
  232.     break;
  233.       case 17:
  234.     cameraAngles.tx -= 15;
  235.     cameraAngles.tz += 10;
  236.     changedAngles = TRUE;
  237.     break;
  238.     }
  239. #endif
  240.  
  241.     /* validate input events */
  242.     if (flyMode) {
  243.       if (cameraAngles.tz - lastCamera.tz) {
  244.     cameraAngles.ty -= (cameraAngles.tz - lastCamera.tz) / 4;
  245.     changedAngles = TRUE;
  246.       }
  247.       currentSpeed[0] += decSpeed;
  248.       changedLocation = TRUE;
  249.     }
  250.  
  251.     if (changedAngles) {
  252.       if (cameraAngles.tx > 360)
  253.     cameraAngles.tx -= 360;
  254.       else if (cameraAngles.tx < 0)
  255.     cameraAngles.tx += 360;
  256.  
  257.       if (cameraAngles.ty > 360)
  258.     cameraAngles.ty -= 360;
  259.       else if (cameraAngles.ty < 0)
  260.     cameraAngles.ty += 360;
  261.       if ((cameraAngles.ty > 45) && (cameraAngles.ty < 180))
  262.     cameraAngles.ty = 45;
  263.       else if ((cameraAngles.ty < 315) && (cameraAngles.ty > 180))
  264.     cameraAngles.ty = 315;
  265.  
  266.       if (cameraAngles.tz > 360)
  267.     cameraAngles.tz -= 360;
  268.       else if (cameraAngles.tz < 0)
  269.     cameraAngles.tz += 360;
  270.  
  271.       lastCamera.tz = cameraAngles.tz;
  272.     }
  273.  
  274.     if (changedLocation) {
  275.       if (currentSpeed[0] >= maxSpeed)
  276.     currentSpeed[0] = maxSpeed;
  277.       else if (currentSpeed[0] <= -maxSpeed)
  278.     currentSpeed[0] = -maxSpeed;
  279.  
  280.       if (currentSpeed[2] >= maxSpeed)
  281.     currentSpeed[2] = maxSpeed;
  282.       else if (currentSpeed[2] <= -maxSpeed)
  283.     currentSpeed[2] = -maxSpeed;
  284.  
  285.       position = find_contents(bspMem);
  286.       switch (position) {
  287.     case CONTENTS_EMPTY:                    /* not possible */
  288.       break;
  289.     case CONTENTS_SOLID:                    /* correct position */
  290.       break;
  291.     case CONTENTS_WATER:                    /* swim */
  292.       break;
  293.     case CONTENTS_SLIME:                    /* damage */
  294.       break;
  295.     case CONTENTS_LAVA:                    /* more damage */
  296.       break;
  297.     case CONTENTS_SKY:                    /* not possible */
  298.       break;
  299.       }
  300.     }
  301.  
  302.     updateTimings();                        /* liquid, sky */
  303.  
  304.     /* recalc renderer if nessecary and render and display */
  305.     set_view_info();
  306.     renderWorld(bspMem);
  307.     localDim.frameBuffer = SwapDisplay(localDim.frameBuffer);
  308.   }
  309. }
  310.  
  311. static bool inited = FALSE;
  312.  
  313. bool DisplayBSP(__memBase, char *Title, int width, int height, int depth, int display, bool wait) {
  314.   struct entity *plEnt;
  315.  
  316.   displayType = display;
  317.  
  318.   bspMem->mapOptions |= MAP_LOADLIGHTS;
  319.   AllocClusters(bspMem, MAP_ENTITIES);
  320.   LoadMapFile(bspMem, bspMem->shared.quake1.dentdata);
  321.  
  322.   if (!(visibleFaces = (unsigned char *)kmalloc((bspMem->shared.quake1.numfaces + 32) * sizeof(unsigned char))))
  323.     Error(failed_memory, (bspMem->shared.quake1.numfaces + 32) * sizeof(unsigned char), "visible faces");
  324.   if (!(visibleLeafs = (unsigned char *)kmalloc(((bspMem->shared.quake1.numleafs >> 3) + 32) * sizeof(unsigned char))))
  325.     Error(failed_memory, ((bspMem->shared.quake1.numleafs >> 3) + 32) * sizeof(unsigned char), "visible leafs");
  326.   __memset(visibleLeafs, 0xFF, ((bspMem->shared.quake1.numleafs >> 3) + 1) * sizeof(unsigned char));
  327.   if (!(visibleNodes = (unsigned char *)kmalloc(((bspMem->shared.quake1.numnodes >> 3) + 32) * sizeof(unsigned char))))
  328.     Error(failed_memory, ((bspMem->shared.quake1.numnodes >> 3) + 32) * sizeof(unsigned char), "visible nodes");
  329.   __memset(visibleNodes, 0xFF, ((bspMem->shared.quake1.numnodes >> 3) + 1) * sizeof(unsigned char));
  330.  
  331.   /* find players start-point */
  332.   if ((plEnt = FindEntityWithKeyPair(bspMem, "classname", "info_player_start"))) {
  333.     VectorCopy(plEnt->origin, cameraLocation);
  334.     cameraAngles.tx = 0;
  335.     cameraAngles.ty = 0;
  336.     cameraAngles.tz = plEnt->angle;
  337.     mprintf("Current Pos - [%f] [%f] [%f]\nAngle [%d]\n", cameraLocation[0], cameraLocation[1], cameraLocation[2], cameraAngles.tz);
  338.     changedAngles = TRUE;
  339.     changedLocation = TRUE;
  340.   }
  341.  
  342.   /* force load of palette and colormap */
  343.   darkness = 63;
  344.   tfree(GetPalette());
  345.  
  346.   if (cachedColormap && cachedPalette) {
  347.     if(!inited) {
  348.       SetDisplay(OpenDisplay(width, height, depth, cachedPalette));
  349.       OpenKeys();
  350.       __bzero(localDim.frameBuffer, localDim.frameSize * localDim.frameBPP);
  351.       localDim.frameBuffer = SwapDisplay(localDim.frameBuffer);
  352.  
  353.       inited = TRUE;
  354.     }
  355.     ChangeDisplay(width, height, 0, 0, Title);
  356.  
  357. #ifdef    DRIVER_8BIT
  358.     if (localDim.frameDepth == 8) {
  359. /*    UpdateDisplay(cachedColormap, 0, 0, 256, 64);               // only 8bit */
  360.  
  361.       /* setup water                                              // only 8bit */
  362.       waterTransparency = GetTransparency(DENSITY_WATER);
  363. /*    UpdateDisplay(waterTransparency, 0, 0, 256, 256);           // only 8bit */
  364.  
  365.       /* setup slime                                              // only 8bit */
  366.       slimeTransparency = GetTransparency(DENSITY_SLIME);
  367. /*    UpdateDisplay(slimeTransparency, 0, 0, 256, 256);           // only 8bit */
  368.  
  369.       /* setup lava                                               // only 8bit */
  370.       lavaTransparency = GetTransparency(DENSITY_LAVA);
  371. /*    UpdateDisplay(lavaTransparency, 0, 0, 256, 256);            // only 8bit */
  372.     }
  373. #endif
  374.  
  375.     InitSinCosTables();
  376.     InitFaceCache(bspMem);
  377.     setup_default_point_list();
  378.     run_demo(bspMem);
  379.   }
  380.  
  381.   kfree();
  382.  
  383.   if(!wait)
  384.     DisplayEnd();
  385.   
  386.   return TRUE;
  387. }
  388.  
  389. bool DisplayPicture(void *pic, char *Title, int width, int height, int depth, bool wait) {
  390.   bool noContinue = FALSE;
  391.   struct keyEvent inPut;
  392.  
  393.   if(!inited) {
  394.     SetDisplay(OpenDisplay(width, height, depth, cachedPalette));
  395.     OpenKeys();
  396.     __bzero(localDim.frameBuffer, localDim.frameSize * localDim.frameBPP);
  397.     localDim.frameBuffer = SwapDisplay(localDim.frameBuffer);
  398.  
  399.     inited = TRUE;
  400.   }
  401.   
  402.   ChangeDisplay(width, height, depth, cachedPalette, Title);
  403.   __bzero(localDim.frameBuffer, localDim.frameSize * localDim.frameBPP);
  404.   UpdateDisplay(pic, 0, 0, width, height);
  405.  
  406.   while (GetKeys(&inPut)) {
  407.     /* leave display-loop */
  408.     if (inPut.pressed == RAWKEY_ESCAPE) {
  409.       noContinue = TRUE;
  410.       break;
  411.     }
  412.     /* next picture */
  413.     if (inPut.pressed == RAWKEY_SPACE) {
  414.       noContinue = FALSE;
  415.       break;
  416.     }
  417.   }
  418.   
  419.   if(!wait)
  420.     DisplayEnd();
  421.   
  422.   return noContinue;
  423. }
  424.  
  425. void DisplayEnd(void) {
  426.   if(inited) {
  427.     CloseKeys();
  428.     CloseDisplay();
  429.  
  430.     inited = FALSE;
  431.   }
  432. }
  433.